#这个文件描述的是竞技场
import cocos
from cocos.director import director

import define
from snake import Snake
from dot import Dot


class Arena(cocos.layer.ColorLayer):
    #下面是将一个类或对象标记为事件处理器（Event Handler）的属性设置。
    is_event_handler = True

    def __init__(self):
        super(Arena, self).__init__(255, 255, 255, 255, define.WIDTH, define.HEIGHT)
        self.center = (director.get_window_size()[0]/2, director.get_window_size()[1]/2)#the head fo the snake is set to at the center of our screen
        self.batch = cocos.batch.BatchNode()#创建了一个批次节点对象，并将其赋值给self.batch属性。
        '''HAOHAO: 批次节点是Cocos引擎中的一个特殊节点，用于优化渲染性能。
        它可以将多个精灵对象合并为一个批次进行渲染，
        从而减少渲染调用次数，提高效率。
        '''
        self.add(self.batch)#将批次节点添加到当前场景中
        '''self.add()是场景类的方法，用于将节点添加到场景中进行渲染和显示。'''

        self.snake = Snake() #创建了一个蛇对象，并将其赋值给self.snake属性
        #将蛇对象添加到当前场景中，并指定了一个Z轴顺序（深度）为10000。这决定了蛇对象在场景中的渲染顺序。
        self.add(self.snake, 10000)
        '''
        HAOHAO:在Cocos引擎中，Z轴顺序用于确定场景中各个节点的渲染顺序。
        较小的Z轴值表示节点在渲染时应该位于较前面的位置，
        而较大的Z轴值表示节点在渲染时应该位于较后面的位置。----------------------------very fucking important
        通过为蛇对象设置一个较大的Z轴值10000，可以确保在场景中的大多数其他节点之上进行渲染。
        这可以使蛇对象在渲染时位于其他节点的上方，从而使蛇对象在视觉上处于前景位置。
        这在游戏中非常有用，因为它可以确保蛇对象在其他游戏元素之上进行渲染，
        例如背景、地图、障碍物等。这样可以确保蛇对象在渲染时不会被其他元素遮挡，
        保证了游戏画面的正确呈现。
        '''
        self.snake.init_body() #初始化蛇
        self.enemies = [] #人机列表，外面全是敌人
        for i in range(10):
            self.add_enemy()

        '''创建了一个空的集合对象，并将其赋值给self.keys_pressed属性。
        这个集合用于存储当前按下的键的信息，通常在处理键盘事件时使用。'''
        self.keys_pressed = set()

        #添加食物
        for i in range(200):
            self.batch.add(Dot())
        #将update方法安排为定时更新方法。这意味着在每帧渲染之后，引擎会自动调用update方法，用于更新游戏逻辑、检测碰撞、更新对象状态等操作
        self.schedule(self.update)

    def add_enemy(self):
        enemy = Snake(True) #设置is_enemy == True
        self.add(enemy, 10000) #和上面同理
        enemy.init_body()
        self.enemies.append(enemy) #加入enemy列表，从此世界上多了一条敌人蛇。。。。。。

    def update(self, dt): #保证屏幕的中间一直是蛇头，相对坐标
        self.x = self.center[0] - self.snake.x
        self.y = self.center[1] - self.snake.y

    def on_key_press(self, key, modifiers):
        self.keys_pressed.add(key)    #将当前按下的操作加入按键集合中
        self.snake.update_angle(self.keys_pressed)

    def on_key_release (self, key, modifiers):
        self.keys_pressed.remove(key)  #松手就要把按键key给移除
        self.snake.update_angle(self.keys_pressed)
